#include <iostream>
#include <unordered_map>
#include <string>
#include <TcpServer.h>
#include "EventLoop.h"
#include "TcpConnection.h" //库放在系统路径里了

using namespace std;
using namespace muduo::net;

class TranslateServer
{
public:
    TranslateServer(uint16_t port) // 构造函数：调用服务器类的构造函数
        : _server(&_baseloop, muduo::net::InetAddress("0.0.0.0", port), "TranslateServer", muduo::net::TcpServer::kReusePort)
    { // 参数绑定回调
        _server.setConnectionCallback(bind(&TranslateServer::onConnection, this, placeholders::_1));
        _server.setMessageCallback(bind(&TranslateServer::onMessage, this, placeholders::_1, placeholders::_2, placeholders::_3));

        LoadDict();
    }
    void Start() // 启动服务器
    {
        _server.start();  // 开始服务器监听：打开监听套接字
        _baseloop.loop(); // 开始事件监控：获取连接和消息（请求），死循环阻塞式
    }

private:
    void onConnection(const muduo::net::TcpConnectionPtr &conn)
    { // 新连接建立成功时的回调函数
        if (conn->connected() == true)
            cout << "连接建立成功" << endl;
        else
            cout << "新连接关闭" << endl;
    }
    void onMessage(const muduo::net::TcpConnectionPtr &conn /*连接*/, muduo::net::Buffer *buf /*消息*/, muduo::Timestamp /*时间*/)
    { // 接收到请求时，进行处理回调
        // 1.从buffer取出数据
        string str = buf->retrieveAllAsString();
        // 2.业务处理
        string ret = Translate(str);
        // 3.返回响应
        conn->send(ret);
    }
    void LoadDict()
    {
        dict_map.insert(make_pair("hello", "你好"));
        dict_map.insert(make_pair("OK", "好的"));
        dict_map.insert(make_pair("abc", "ABC"));
        dict_map.insert(make_pair("banana", "芭拿拿"));
    }
    string Translate(const string &str)
    {
        auto iter = dict_map.find(str);
        if (iter == dict_map.end())
            return "unknown";
        return iter->second;
    }

private:
    muduo::net::EventLoop _baseloop;
    muduo::net::TcpServer _server; // 服务器类

    unordered_map<string, string> dict_map;
};

int main()
{
    TranslateServer server(8080);
    server.Start();

    return 0;
}
